home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
301-325
/
305
/
prfont
/
prfont.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-14
|
8KB
|
303 lines
/**********************************************************************/
/* */
/* PrFont - Version 1.3 */
/* */
/* by Joel Swank 1/12/89 */
/* */
/**********************************************************************/
/**********************************************************************/
/* */
/* PrFont - Prints a sample of all fonts in the fonts: directory */
/* */
/**********************************************************************/
/* */
/* Modification log: */
/* */
/* 2/5/89 Original Idea implemented */
/* 2/12/89 Switched to Availfonts from directory scan */
/* 5/21/89 Adjust screen/window parameters */
/* 5/30/89 fix open before getargs bug */
/* */
/**********************************************************************/
#include <stdio.h>
#include <functions.h>
#include "myscreen.h"
#include "defines.h"
/*
* Some Font stuff
*/
struct TextFont *myfont = NULL; /* pointer to open font */
struct TextAttr *myattr; /* pointer to Attribute struct */
struct AvailFontsHeader *avlbuf = NULL; /* pointer to availfonts buffer */
struct AvailFonts *af; /* pointer to availfonts entries */
/* Intuition pointers */
struct Window *Wind = NULL ;
struct Screen *MyScreen = NULL ;
struct RastPort *rp;
/* Library pointers */
struct Library *DiskfontBase = NULL;
struct IntuitionBase *IntuitionBase ;
struct DosBase *DosBase = NULL;
struct GfxBase *GfxBase = NULL;
char *rindex();
long screenpos; /* current screen Y location */
long all = FALSE; /* flag - show all chars - set in doargs */
int bufsize = 0; /* size of availfonts buffer */
main(argc, argv)
int argc;
char *argv[];
{
char tb;
register i, j;
int err;
screenpos = SCREENPOSINIT;
if (argc == 0) getWBargs();
else getCLIargs(argc,argv);
open_all(); /* Open everything */
/* find size of buffer needed */
bufsize = AvailFonts(&tb,1L,AFF_MEMORY | AFF_DISK)+2;
/* get a buffer of that size */
avlbuf = (struct AvailFontsHeader *) AllocMem(bufsize,MEMF_PUBLIC);
if (avlbuf == NULL)
{
AutoRequest(Wind,&memmsg,0L,&oktxt,0L,0L,300L,75L);
done(26);
}
/* get list of all the system fonts */
err = AvailFonts(avlbuf,bufsize,AFF_MEMORY | AFF_DISK);
if (err != NULL)
{
AutoRequest(Wind,&availmsg,0L,&oktxt,0L,0L,300L,75L);
done(28);
}
af = (struct Availfonts *) &(avlbuf[1]);
for (j=0; j<avlbuf->afh_NumEntries; j++,af++)
{ /* weed out duplicates */
if ((af->af_Attr.ta_Flags & FPF_REMOVED) || /* fi removed ... */
(af->af_Attr.ta_Flags & FPF_REVPATH) || /* or reverse ... */
((af->af_Type & AFF_MEMORY) && /* or NOT memory AND disk */
(af->af_Attr.ta_Flags & FPF_DISKFONT))); /* then skip */
else {
myattr = &(af->af_Attr);
dofont();
}
}
if (screenpos > SCREENPOSINIT) do_print();
done(0);
}
/*
* do font described by myattr
*/
dofont()
{
char stringbuf[500];
char fontsave[50];
int istart;
register long fheight;
register long i;
register char *j;
/* get a copy of name */
strcpy(fontsave,myattr->ta_Name);
j = rindex(fontsave,'.');
if (j != NULL) *j = '\0';
if ((myfont = (struct TextFont *) OpenDiskFont(myattr)) == NULL)
{
sprintf(msgfilename,"%s %ld\n",fontsave,
myattr->ta_YSize);
AutoRequest(Wind,&openfomsg,0L,&oktxt,0L,0L,300L,75L);
}
else
{
fheight = myfont->tf_YSize; /* get actual size */
/* not the requested font, skippit */
if (fheight != myattr->ta_YSize) return;
SetFont(rp,myfont);
/* build string to print */
sprintf(stringbuf,"%s %ld ",fontsave,fheight);
j = stringbuf+strlen(stringbuf);
istart=myfont->tf_LoChar;
if (istart <=0) istart = 1;
for (i=istart; i<= myfont->tf_HiChar; i++)
*j++ = (char) i;
stringbuf[j++] = '\0';
if (all)
{
display_font(stringbuf);
}
else
{
/* move down enough for */
screenpos += fheight+2;
if (screenpos > MyScreen->Height)
{ /* when screen gets full, print it */
do_print();
screenpos = SCREENPOSINIT+fheight;
clr_scr();
}
/* move to baseline of charcter */
Move(rp,2,screenpos-fheight+myfont->tf_Baseline);
Text(rp,stringbuf,strlen(stringbuf));
}
CloseFont(myfont);
myfont = NULL;
}
}
/*
* display all characters of a font
*/
display_font(buf)
register char *buf;
{
register int start = 0;
register int i;
int indent = 2;
int fheight;
while (1)
{
i=0;
while(buf[i+start] != '\0')
{
if (TextLength(rp,&buf[start],i) >= Wind->Width-indent)
{
i--;
break;
}
i++;
}
if (i==0) break;
fheight = myfont->tf_YSize; /* get actual size */
/* move down enough for */
screenpos += fheight+2;
if (screenpos > MyScreen->Height)
{ /* when screen gets full, print it */
do_print();
screenpos = SCREENPOSINIT+fheight;
clr_scr();
}
/* move to baseline of charcter */
Move(rp,indent,screenpos-fheight+myfont->tf_Baseline);
Text(rp,&buf[start],i);
indent = 30;
start += i;
}
}
/*
* Open all the stuff I need
*/
open_all()
{
/* Open the screen and window */
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", NULL)) == NULL)
done(21); /* if no intuition I can't even autorequest */
if ((MyScreen = (struct Screen *)
OpenScreen(&NewScreenStructure)) == NULL)
{
AutoRequest(0L,&screenfail,0L,&oktxt,0L,0L,300L,75L);
done(23);
}
New_Window.Screen = MyScreen;
if ((Wind = (struct Window *) OpenWindow(&New_Window)) == NULL)
{
AutoRequest(0L,&windfail,0L,&oktxt,0L,0L,300L,75L);
done(25);
}
rp = Wind->RPort;
/**** Open the Libraries ****/
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", NULL);
if (GfxBase == NULL)
{
strcpy(msgfilename,"Graphics");
AutoRequest(Wind,&libfailmsg,0L,&oktxt,0L,0L,300L,75L);
done(20);
}
DiskfontBase = (struct Library *)OpenLibrary("diskfont.library", NULL);
if (DiskfontBase == NULL) {
strcpy(msgfilename,"DiskFont");
AutoRequest(Wind,&libfailmsg,0L,&oktxt,0L,0L,300L,75L);
done(22);
}
if ((DosBase = (struct DosBase *)
OpenLibrary("dos.library", 0)) == NULL)
{
strcpy(msgfilename,"Dos");
AutoRequest(Wind,&libfailmsg,0L,&oktxt,0L,0L,300L,75L);
done(27);
}
}
/*
* done - just clean up that which is open, and then leave.
*/
done(how)
int how;
{
if (avlbuf) FreeMem(avlbuf, (long) (bufsize));
if (myfont != NULL) CloseFont(myfont);
if (Wind) CloseWindow(Wind) ;
if (MyScreen) CloseScreen(MyScreen) ;
if (IntuitionBase) CloseLibrary(IntuitionBase) ;
if (GfxBase) CloseLibrary(GfxBase) ;
if (DosBase) CloseLibrary(DosBase) ;
if (DiskfontBase) CloseLibrary(DiskfontBase) ;
exit(how) ;
}
/*
* clr_scr : clear the window area of the screen
*
*/
clr_scr()
{
SetAPen(rp,0L);
RectFill(rp,0L,SCREENPOSINIT,Wind->Width,Wind->Height);
SetAPen(rp,1L);
}
_abort()
{
done(24);
}